home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
6366
/
6366.xpi
/
components
/
xdGestureMapping.js
< prev
next >
Wrap
Text File
|
2009-11-17
|
10KB
|
319 lines
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
const TYPE_CATEGORY = Ci.xdIGestureMapping.TYPE_CATEGORY;
const TYPE_NORMAL = Ci.xdIGestureMapping.TYPE_NORMAL;
const TYPE_SCRIPT = Ci.xdIGestureMapping.TYPE_SCRIPT;
const RDF_NS = "http://www.xuldev.org/firegestures-mapping#";
const RDF_ROOT = "urn:mapping:root";
const BROWSER_ID = "gesture_mappings";
const WINDOW_TYPE = "FireGestures:Options";
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function alert(aMsg) {
Cu.reportError(aMsg);
var fuelApp = Cc["@mozilla.org/fuel/application;1"].getService(Ci.fuelIApplication);
fuelApp.console.open();
}
function xdGestureMapping() {}
xdGestureMapping.prototype = {
classDescription: "Mouse Gesture Mapping",
contractID: "@xuldev.org/firegestures/mapping;1",
classID: Components.ID("{d7018e80-d6da-4cbc-b77f-8dca4d95bbbf}"),
QueryInterface: XPCOMUtils.generateQI([
Ci.nsISupports,
Ci.xdIGestureMapping
]),
get rdfSvc() {
if (!this._rdfSvc)
this._rdfSvc = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
return this._rdfSvc;
},
_rdfSvc: null,
id: null,
name: null,
_dataSource: null,
_mapping: null,
_getDBConnection: null,
init: function FGM_init(aID, aURI, aName) {
if (this._dataSource)
throw Cr.NS_ERROR_ALREADY_INITIALIZED;
if (!/^\w+$/.test(aID))
throw Cr.NS_ERROR_ILLEGAL_VALUE;
this.id = aID;
this.name = aName;
var gestureSvc = Cc["@xuldev.org/firegestures/service;1"].getService(Ci.xdIGestureService);
this._getDBConnection = gestureSvc.getDBConnection;
try {
this._dataSource = this.rdfSvc.GetDataSourceBlocking(aURI);
}
catch(ex) {
alert("FireGestures: An error occurred while parsing gesture mapping.\n\n" + ex);
throw ex;
}
this._reloadMapping();
},
_ensureInit: function FGM__ensureInit() {
if (!this._dataSource)
throw Cr.NS_ERROR_NOT_INITIALIZED;
},
finalize: function FGM_finalize() {
if (this._dataSource)
this.rdfSvc.UnregisterDataSource(this._dataSource);
this.id = null;
this.name = null;
this._dataSource = null;
this._mapping = null;
},
_reloadMapping: function FGM__reloadMapping() {
this._mapping = null;
this._getUserMapping() || this._getDefaultMapping();
},
_getUserMapping: function FGM__getUserMapping() {
this._ensureInit();
var dbConn = this._getDBConnection(false);
if (!dbConn || !dbConn.tableExists(this.id))
return false;
this._mapping = {};
var stmt = dbConn.createStatement("SELECT * FROM " + this.id);
try {
while (stmt.executeStep()) {
var type = stmt.getInt32(0);
var name = stmt.getUTF8String(1);
var command = stmt.getUTF8String(2);
var direction = stmt.getUTF8String(3);
if (!command || !direction)
continue;
if (type != TYPE_SCRIPT)
name = this._getLocalizedNameForCommand(command);
this._mapping[direction] = new xdGestureCommand(type, name, command);
}
}
catch(ex) { Cu.reportError(ex); }
finally { stmt.reset(); stmt.finalize(); }
return true;
},
_getDefaultMapping: function FGM__getDefaultMapping() {
this._ensureInit();
this._mapping = {};
var rdfCont = Cc["@mozilla.org/rdf/container;1"].createInstance(Ci.nsIRDFContainer);
rdfCont.Init(this._dataSource, this.rdfSvc.GetResource(RDF_ROOT));
var resEnum = rdfCont.GetElements();
while (resEnum.hasMoreElements()) {
var res = resEnum.getNext().QueryInterface(Ci.nsIRDFResource);
var type = parseInt(this._getPropertyValue(res, "type"), 10);
var name = this._getPropertyValue(res, "name");
var command = res.Value.substr(("urn:").length);
var direction = this._getPropertyValue(res, "direction");
var extra = this._getPropertyValue(res, "extra");
if (type == TYPE_CATEGORY || (!direction && !extra))
continue;
this._mapping[direction] = new xdGestureCommand(type, name, command);
if (extra)
this._mapping[extra] = new xdGestureCommand(type, name, command);
}
},
_getLocalizedNameForCommand: function FGM__getLocalizedNameForCommand(aCommand) {
var res = this.rdfSvc.GetResource("urn:" + aCommand);
return this._getPropertyValue(res, "name");
},
_getPropertyValue: function FGM__getPropertyValue(aRes, aProp) {
aProp = this.rdfSvc.GetResource(RDF_NS + aProp);
try {
var target = this._dataSource.GetTarget(aRes, aProp, true);
return target ? target.QueryInterface(Ci.nsIRDFLiteral).Value : null;
}
catch(ex) {
return null;
}
},
getCommandForDirection: function FGM_getCommandForDirection(aDirection) {
return this._mapping[aDirection];
},
configure: function FGS_configure() {
var browser = this.id == BROWSER_ID;
var type = browser ? WINDOW_TYPE : WINDOW_TYPE + ":" + this.id;
var winMed = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var win = winMed.getMostRecentWindow(type);
if (win) {
win.focus();
win.document.documentElement.showPane(win.document.getElementById("mappingPane"));
return;
}
var url = browser ? "chrome://firegestures/content/prefs.xul" :
"chrome://firegestures/content/prefs-generic.xul";
var features = "chrome,titlebar,toolbar,centerscreen,resizable,dialog=no";
win = winMed.getMostRecentWindow(null);
if (browser)
win.openDialog(url, type, features);
else
win.openDialog(url, type, features, this.id);
},
getMappingArray: function FGM_getMappingArray() {
this._ensureInit();
var items = [];
var dbConn = this._getDBConnection(false);
if (!dbConn || !dbConn.tableExists(this.id))
dbConn = null;
var rdfCont = Cc["@mozilla.org/rdf/container;1"].createInstance(Ci.nsIRDFContainer);
rdfCont.Init(this._dataSource, this.rdfSvc.GetResource(RDF_ROOT));
var resEnum = rdfCont.GetElements();
while (resEnum.hasMoreElements()) {
var res = resEnum.getNext().QueryInterface(Ci.nsIRDFResource);
var type = parseInt(this._getPropertyValue(res, "type"), 10);
var name = this._getPropertyValue(res, "name");
var command = res.Value.substr("urn:".length);
var flags = this._getPropertyValue(res, "flags");
if (dbConn && type == TYPE_NORMAL) {
var directions = [];
var stmt = dbConn.createStatement("SELECT direction FROM " + this.id + " WHERE command = ?");
stmt.bindUTF8StringParameter(0, command);
try {
while (stmt.executeStep())
directions.push(stmt.getUTF8String(0));
}
catch(ex) { Cu.reportError(ex); }
finally { stmt.reset(); stmt.finalize(); }
if (!directions.some(function(direction) { return /^[LRUD]*$/.test(direction); }))
directions.unshift("");
for each (var direction in directions)
items.push([type, name, command, direction, flags]);
}
else {
var direction = this._getPropertyValue(res, "direction") || "";
var extra = this._getPropertyValue(res, "extra");
items.push([type, name, command, direction, flags]);
if (extra)
items.push([type, name, command, extra, flags]);
}
}
if (dbConn) {
var sql = "SELECT name, command, direction FROM " + this.id + " WHERE type = " + TYPE_SCRIPT;
var stmt = dbConn.createStatement(sql);
try {
while (stmt.executeStep()) {
items.push([
TYPE_SCRIPT, stmt.getUTF8String(0), stmt.getUTF8String(1), stmt.getUTF8String(2), null
]);
}
}
catch(ex) { Cu.reportError(ex); }
finally { stmt.reset(); stmt.finalize(); }
}
return items;
},
saveUserMapping: function FGM_saveUserMapping(aItems) {
this._ensureInit();
var dbConn = this._getDBConnection(true);
dbConn.executeSimpleSQL("DROP TABLE IF EXISTS " + this.id);
dbConn.createTable(this.id, "type INTEGER, name TEXT, command TEXT, direction TEXT");
dbConn.beginTransaction();
for each (let [type, name, command, direction] in aItems) {
if (type == TYPE_CATEGORY || (type == TYPE_NORMAL && (!direction || !command)))
continue;
var stmt = dbConn.createStatement("INSERT INTO " + this.id + " VALUES(?,?,?,?)");
stmt.bindInt32Parameter(0, type);
stmt.bindUTF8StringParameter(1, type == TYPE_SCRIPT ? name : "");
stmt.bindUTF8StringParameter(2, command);
stmt.bindUTF8StringParameter(3, direction);
try {
stmt.execute();
}
catch(ex) { Cu.reportError(ex); }
finally { stmt.reset(); stmt.finalize(); }
}
dbConn.commitTransaction();
this._reloadMapping();
},
addScriptCommands: function FGM_addScriptCommands(aItems) {
this._ensureInit();
var added = false;
var items = this.getMappingArray();
outer: for each (let aItem in aItems) {
if (this.getCommandForDirection(aItem.direction))
aItem.direction = "";
inner: for each (let [ type, , script, ] in items) {
if (type != TYPE_SCRIPT)
continue inner;
if (script == aItem.script)
continue outer;
}
items.push([TYPE_SCRIPT, aItem.name, aItem.script, aItem.direction, null]);
added = true;
}
if (!added)
return;
this.saveUserMapping(items);
this._reloadMapping();
},
};
function xdGestureCommand(aType, aName, aCommand, aDirection) {
this.type = aType;
this.name = aName;
this.value = aCommand;
this.direction = aDirection;
}
xdGestureCommand.prototype = {
QueryInterface: function(aIID) {
if (!aIID.equals(Ci.nsISupports) &&
!aIID.equals(Ci.xdIGestureCommand)) {
throw Cr.NS_ERROR_NO_INTERFACE;
}
return this;
}
};
function NSGetModule(compMgr, fileSpec) {
return XPCOMUtils.generateModule([xdGestureMapping]);
}